package service

import (
	"a-common/constant"
	"a-common/utils/tree"
	"a-system/dao"
	"a-system/domain/entity"
	"fmt"
	"strings"
	"sync"

	"github.com/gofiber/fiber/v2"
)

var (
	sysMenuServiceTemp *SysMenuService
	sysMenuDao         = dao.NewSysMenuDao()
	sysMenuServiceOnce sync.Once
)

type SysMenuService struct{}

func NewSysMenuService() *SysMenuService {
	sysMenuServiceOnce.Do(func() {
		sysMenuServiceTemp = &SysMenuService{}
	})
	return sysMenuServiceTemp
}

// List 列表
func (m *SysMenuService) List(userId int64) (rows []entity.SysMenuVo, err error) {
	// 只有超管才可以获取菜单
	if constant.ADMIN_ID != userId {
		return rows, fmt.Errorf("not super admin")
	}
	return sysMenuDao.List()
}

// ListSelect 列表下拉
func (m *SysMenuService) ListSelect(userId int64) (rows []entity.SysMenuVo, err error) {
	// 只有超管才可以获取菜单
	if constant.ADMIN_ID != userId {
		return rows, fmt.Errorf("not super admin")
	}
	// 获取所有菜单
	rows, err = sysMenuDao.MenuList()
	if err != nil {
		return
	}

	// 遍历
	// var pid int64
	for i := 0; i < len(rows); i++ {
		if rows[i].Pid == 0 {
			continue
		}
		rows[i].Title = "	|-" + rows[i].Title
	}
	return
}

// Tree 树表
func (m *SysMenuService) Tree(userId int64) (treeData []map[string]any, err error) {
	// 获取所有菜单
	rows, err := m.List(userId)
	if err != nil {
		return
	}

	// 构建菜单树
	treeData = tree.GenerateTree(rows, &tree.TreeConfig{
		Rid:        0,
		IdName:     "id",
		PidName:    "pid",
		WeightName: "weigh",
	})
	return
}

// Get 查
func (m *SysMenuService) Get(menuId string) (entity.SysMenuPageVo, error) {
	return sysMenuDao.Get(menuId)
}

// Del 删
func (m *SysMenuService) Del(ids string) (int64, error) {
	return sysMenuDao.Del(ids)
}

// Add 增
func (m *SysMenuService) Add(args *entity.SysMenuDto) (int64, error) {
	return sysMenuDao.Add(args)
}

// Edit 改
func (m *SysMenuService) Edit(args *entity.SysMenuDto) (int64, error) {
	return sysMenuDao.Edit(args)
}

// RoleMenuTreeselect 通过角色权限获取菜单树
func (m *SysMenuService) RoleMenuTreeselect(roleId string, uid int64) (fiber.Map, error) {
	// 获取选中项
	// roleVo, err := sysRoleDao.Get(roleId)
	// if err != nil {
	// 	return nil, err
	// }
	// checkedKeys, err := sysMenuDao.GetmenuIdsByRoleId(roleVo.RoleId, roleVo.MenuCheckStrictly)
	// if err != nil {
	// 	return nil, err
	// }

	// 获取菜单
	// vPage, err := sysMenuDao.List(&entity.SysMenuDto{}, uid)
	// if err != nil {
	// 	return nil, err
	// }
	// rows, _ := vPage.Rows.([]entity.SysMenuPageVo)

	// // 扩展字段
	// mp := make(map[string]string, 1)
	// mp["id"] = "menuId"
	// // 构建菜单树
	// treeData := tree.GenerateTree(rows, &tree.TreeConfig{
	// 	Rid:        0,
	// 	IdName:     "menuId",
	// 	PidName:    "pid",
	// 	WeightName: "weigh",
	// 	Mapper:     mp,
	// })

	return fiber.Map{}, nil
}

// GetTree 获取菜单树
func (m *SysMenuService) GetTree(args *entity.SysMenuDto, uid int64) (nodeList []map[string]any, err error) {
	// vPage, err := sysMenuDao.List(args, uid)
	// if err != nil {
	// 	return nodeList, err
	// }
	// rows, _ := vPage.Rows.([]entity.SysMenuPageVo)

	// // 扩展字段
	// mp := make(map[string]string, 1)
	// mp["id"] = "menuId"
	// // 构建菜单树
	// treeData := tree.GenerateTree(rows, &tree.TreeConfig{
	// 	Rid:        0,
	// 	IdName:     "menuId",
	// 	PidName:    "pid",
	// 	WeightName: "weigh",
	// 	Mapper:     mp,
	// })

	return nil, err
}

// GetTreeSelect 获取菜单列表及根据权限id获取菜单id
func (m *SysMenuService) GetTreeSelect(ids string) (fiber.Map, error) {
	arr := strings.Split(ids, `,`)
	// 获取权限所拥有的菜单列表id
	checkedKeys, err := sysRoleDao.GetMenuIdsByRoleIds(arr)
	if err != nil {
		return nil, err
	}

	// 获取菜单列表
	// menuTree, err := sysMenuDao.GetTree()
	// if err != nil {
	// 	return err
	// }

	return fiber.Map{
		"checkedKeys": checkedKeys,
		"menuTree":    nil,
	}, nil
}
